package study.Day_2;

/**
 * LeetCode No.2
 * <p>
 * 给你两个非空的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外，这两个数都不会以 0开头。
 */

import java.util.Objects;

/**
 * 示例 1：
 * 输入：l1 = [2,4,3], l2 = [5,6,4]
 * 输出：[7,0,8]
 * 解释：342 + 465 = 807.
 * <p>
 * 示例 2：
 * 输入：l1 = [0], l2 = [0]
 * 输出：[0]
 * <p>
 * 示例 3：
 * 输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 * 输出：[8,9,9,9,0,0,0,1]
 */
public class Day_two {
    public ListNode addTwoNumbers1(ListNode l1, ListNode l2, int a) {
        int t;
        int l1val = l1 != null ? l1.getVal() : 0;
        int l2val = l2 != null ? l2.getVal() : 0;
        // 计算两数相加与进一位的数的和
        t = l1val + l2val + a;
        // 计算超过十位数的余数 如23 t1=3
        int t1 = t % 10;
        // 如果l1,l2都是空,就判断上一个的a是不是0,
        // 如果是0就表示没有超过10,否则就是超过10,要进一位.用个新的ListNode接收
        if (l1 == null && l2 == null) {
            return a == 0 ? null : new ListNode(a);
        }
        // 计算超过十位数的除数 如23 a=2
        a = t / 10;
        // 如果对象中有next,就将next放进去递归,将余数放进ListNode对象的val中
        if (l1 != null) {
            l1 = l1.getNext();
        }
        if (l2 != null) {
            l2 = l2.getNext();
        }
        return new ListNode(t1, addTwoNumbers1(l1, l2, a));
    }

    /**
     * 格式化返回值
     */
    public void getResult(ListNode listNode, StringBuilder s) {
        if (!Objects.isNull(listNode.getNext())) {
            getResult(listNode.getNext(),s);
        }
        s.append(listNode.getVal());
    }
}
